package co.com.travelsoft.ati.entities.ejb;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import co.com.travelsoft.ati.daos.CiudadesDAO;
import co.com.travelsoft.ati.daos.EventosDAO;
import co.com.travelsoft.ati.daos.PaisesDAO;
import co.com.travelsoft.ati.daos.TiposEventoDAO;
import co.com.travelsoft.ati.dto.CiudadDto;
import co.com.travelsoft.ati.dto.EventoCiudadDto;
import co.com.travelsoft.ati.dto.PaisDto;
import co.com.travelsoft.ati.entities.Ciudades;
import co.com.travelsoft.ati.entities.EventoDto;
import co.com.travelsoft.ati.entities.Eventos;
import co.com.travelsoft.ati.entities.Paises;
import co.com.travelsoft.ati.entities.TipoEventoDto;
import co.com.travelsoft.ati.entities.TiposEvento;
import co.com.travelsoft.ati.exception.TravelSoftException;

/**
 * Session Bean implementation class EventoEJB
 */
@Stateless
public class EventoEJB implements EventoEJBRemote {

	
    /**
     * Default constructor. 
     */
    public EventoEJB() {
    }

	@Override
	public void crearEventoDto(EventoDto EventoDto) throws TravelSoftException {
		Eventos eventos = new Eventos(EventoDto);
		EventosDAO.crear(eventos);
	}

	@Override
	public EventoDto buscarEventoDtoPorId(EventoDto eventoDto) {
		Eventos eventos = new Eventos(eventoDto);
		eventos = EventosDAO.buscarPorId(eventos);
		eventoDto = obtenerEvento(eventos);
		return eventoDto;
	}

	private EventoDto obtenerEvento(Eventos eventos) {
		 EventoDto eventoDto;
		 eventoDto = new EventoDto();
		 eventoDto.setCodigo(eventos.getCodigo());
		 eventoDto.setEstado(eventos.getEstado());
		 eventoDto.setFechafin(eventos.getFechafin());
		 eventoDto.setFechainicio(eventos.getFechainicio());
		 eventoDto.setNombre(eventos.getNombre());
		 eventoDto.setLugar(eventos.getLugar());
		 return eventoDto;
	}

	@Override
	public List<EventoDto> listarEventoDto() {
		List<Eventos> eventos = EventosDAO.listar();
		List<EventoDto> eventoDtos = new ArrayList<EventoDto>();
		for (Eventos evento : eventos) {
			eventoDtos.add(obtenerEvento(evento));
		}
		return eventoDtos;
	}

	@Override
	public void actualizarEventoDto(EventoDto eventoDto)
			throws TravelSoftException {
		Eventos eventos = new Eventos(eventoDto);
		EventosDAO.actualizar(eventos);
	}

	@Override
	public void borrarEventoDto(EventoDto eventoDto) throws TravelSoftException {
		Eventos eventos = new Eventos(eventoDto);
		EventosDAO.borrar(eventos);
	}

	@Override
	public PaisDto buscarPaisPorId(PaisDto paisDto){
		Paises paises = new Paises(paisDto);
		paises = PaisesDAO.buscarPorId(paises);
		PaisDto paisesDto = obtenerPais(paises);
		return paisesDto;
	}

	
	private PaisDto obtenerPais(Paises paises) {
		PaisDto paisDto;
		paisDto = new PaisDto();
		paisDto.setCodigo(paises.getCodigo());
		paisDto.setNombre(paises.getNombre());
		
		return paisDto;
	}

	@Override
	public List<PaisDto> listarPaises() {
		List<Paises> paises = PaisesDAO.listar();
		List<PaisDto> paisDtos = new ArrayList<PaisDto>();
		for (Paises pais : paises) {
			paisDtos.add(obtenerPais(pais));
		}
		return paisDtos;
	}


	@Override
	public CiudadDto buscarCiudadesPorId(CiudadDto ciudadDto) {
		Ciudades ciudad = new Ciudades(ciudadDto);
		ciudad = CiudadesDAO.buscarPorId(ciudad);
		ciudadDto = obtenerCiudad(ciudad);
		return ciudadDto;
	}

	private CiudadDto obtenerCiudad(Ciudades ciudad) {
		CiudadDto ciudadDto;
		ciudadDto = new CiudadDto();
		ciudadDto.setCodigo(ciudad.getCodigo());
		ciudadDto.setPais(obtenerPais(ciudad.getPaises()));
		ciudadDto.setNombre(ciudad.getNombre());
		ciudadDto.setLatitud(ciudad.getLatitud());
		ciudadDto.setLongitud(ciudad.getLongitud());
		return ciudadDto;
	}

	@Override
	public List<CiudadDto> listarCiudades() {
		List<Ciudades> ciudades = CiudadesDAO.listar();
		List<CiudadDto> ciudadDtos = new ArrayList<CiudadDto>();
		for (Ciudades ciudad : ciudades) {
			ciudadDtos.add(obtenerCiudad(ciudad));
		}
		return ciudadDtos;
	}
	
	@Override
	public List<CiudadDto> buscarPorPaisId(Long paisId){
		List<Ciudades> ciudades = CiudadesDAO.buscarPorPaisId(paisId);
		List<CiudadDto> ciudadDtos = new ArrayList<CiudadDto>();
		for (Ciudades ciudad : ciudades) {
			ciudadDtos.add(obtenerCiudad(ciudad));
		}
		return ciudadDtos;
	}

	@Override
	public TipoEventoDto buscarTiposEventoPorId(TipoEventoDto tipoEventoDto) {
		TiposEvento tiposEvento = new TiposEvento(tipoEventoDto);
		tiposEvento = TiposEventoDAO.buscarPorId(tiposEvento);
		tipoEventoDto = obtenerTipoEvento(tiposEvento);
		return tipoEventoDto;
	}

	private TipoEventoDto obtenerTipoEvento(TiposEvento tiposEvento) {
		TipoEventoDto tipoEventoDto = new TipoEventoDto();
		tipoEventoDto.setCodigo(tiposEvento.getCodigo());
		tipoEventoDto.setNombre(tiposEvento.getNombre());
		return tipoEventoDto;
	}

	@Override
	public List<TipoEventoDto> listarTiposEvento() {
		List<TiposEvento> tiposEventos = TiposEventoDAO.listar();
		List<TipoEventoDto> tipoEventoDtos = new ArrayList<TipoEventoDto>();
		for (TiposEvento tiposEvento : tiposEventos) {
			tipoEventoDtos.add(obtenerTipoEvento(tiposEvento));
		}

		return tipoEventoDtos;
	}

	@Override
	public List<EventoCiudadDto> buscarEventoCiudadPorUsuario(BigDecimal codigoUsuario) {
		List<EventoCiudadDto> eventos = EventosDAO.buscarEventoCiudadPorUsuario(codigoUsuario);
		return eventos;
	}

	

}
